package com.lkdont.android.media.opengl

import android.opengl.GLES20
import android.opengl.GLException
import androidx.annotation.IntDef

/**
 * OpenGL着色器
 *
 * @author lqd
 */
abstract class GLShader {

    @IntDef(GLES20.GL_VERTEX_SHADER, GLES20.GL_FRAGMENT_SHADER)
    @Retention(AnnotationRetention.SOURCE)
    annotation class GLShaderType

    /*** 着色器句柄  */
    val handle: Int = create()

    /*** 获取着色器类型 */
    @get:GLShaderType
    abstract val type: Int

    /*** 获取着色器代码 */
    abstract val shaderCode: String

    /*** 创建着色器 */
    private fun create(): Int {
        // 创建着色器
        val shader = GLES20.glCreateShader(type)
        Utils.checkGLError("glCreateShader($type)")
        // 加载着色器代码
        GLES20.glShaderSource(shader, shaderCode)
        GLES20.glCompileShader(shader)
        // 检查编译结果
        val status = IntArray(1)
        GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, status, 0)
        if (status[0] != GLES20.GL_TRUE) {
            val errMsg = GLES20.glGetShaderInfoLog(shader)
            // 释放着色器
            GLES20.glDeleteShader(shader)
            throw GLException(status[0], "Could not compile shader($type) : $errMsg")
        }
        return shader
    }

}